Module 1 Β· Foundations

What is Copilot Studio?

Microsoft Copilot Studio (formerly Power Virtual Agents) is a low-code / no-code platform for building intelligent conversational agents β€” called Copilots β€” that can be embedded into websites, Microsoft Teams, mobile apps, and more. No deep AI/ML knowledge required.

Why Copilot Studio?

⚑

Low-Code Speed

Build and deploy a functional chatbot in hours, not months, using drag-and-drop visual editors.

🧠

Built-in GPT

Leverages Azure OpenAI / GPT models for generative answers over your own knowledge sources.

πŸ”—

Deep Integrations

Connects to Power Automate, Dataverse, SharePoint, Dynamics 365, and 900+ connectors.

🌐

Multi-Channel

Deploy to Teams, websites, mobile, WhatsApp, Slack, and custom channels via Direct Line.

Architecture Overview

USER INPUT "How many vacation days?" COPILOT STUDIO TOPICS (Authored Dialogs) Trigger β†’ Flow β†’ Response GENERATIVE AI (Azure OpenAI / GPT) Knowledge β†’ RAG β†’ Answer ACTIONS Connectors Β· Flows Β· APIs POWER AUTOMATE Flows Β· Logic Β· Connectors SharePoint Β· Email Β· Teams DATAVERSE Tables Β· Records Β· Queries CRM Β· Custom Data Models EXTERNAL APIs REST Β· HTTP Β· Webhooks SAP Β· Salesforce Β· Custom RESPONSE BACK TO USER

Core Concepts at a Glance

TermWhat it meansAnalogy
CopilotThe bot / conversational agent you buildA smart assistant
TopicA conversation flow triggered by user intentA script for a specific subject
Trigger PhraseWords/phrases that activate a topicA keyword that rings a bell
NodeA single step inside a topic (message, question, action)One step in a flowchart
EntityData type extracted from user input (name, date, number)A form field
VariableStored value used across the conversationA variable in code
ActionCalls to external flows, APIs, or connectorsA function call

Copilot Studio vs Traditional Bot Frameworks

FeatureCopilot StudioBot Framework SDK
Skill neededLow-code / citizen devPro developer (C#, Python)
Time to first botMinutesDays to weeks
Generative AIBuilt-in (GPT)Must integrate manually
Custom logicVia Power Automate / pluginsFull code control
Cost modelPer session or messageAzure infra costs
πŸ“Œ

Access: Sign up at copilotstudio.microsoft.com with a Microsoft 365 or Power Platform license. A free trial is available.

🎯 Knowledge Check
What is the primary unit of conversation logic in Copilot Studio?
A Entity
B Topic
C Variable
D Channel
πŸ“ Assignment 1

Explore & Map

Before building anything, explore the platform to get oriented.

  • Sign up / log in to copilotstudio.microsoft.com
  • Identify one real-world business use case at your company or a company you know that a Copilot could solve
  • Write a 3-sentence description: Who uses it? What pain does it solve? What data does it need?
  • List 5 trigger phrases a user might say to start that conversation
Module 1 Β· Foundations

Interface & Navigation

Before you build, you need to know your way around. Copilot Studio has a clean canvas-based UI with a left navigation panel, a topic authoring canvas, and a live test panel. Let's tour every key area.

The Home Screen

1

Home Dashboard

Shows your recently edited Copilots, usage analytics at a glance, and quick-start templates. The top bar shows your environment and tenant.

2

Left Navigation Rail

Topics β€” all your conversation flows. Actions β€” reusable integrations. Knowledge β€” documents/URLs for generative answers. Analytics β€” session data. Settings β€” security, channels, AI features.

3

Authoring Canvas

A node-based flowchart editor where you visually build conversation paths. Drag nodes, connect branches, and configure properties on the right panel.

4

Test Chat Panel

A live chat window (toggled with the "Test your copilot" button) that lets you test your bot instantly without publishing. Changes appear in real time.

5

Publish & Channels

When your bot is ready, publish it and choose channels: Teams, Web, custom Direct Line, etc. Each channel has its own configuration screen.

System Topics (Pre-Built)

Every new Copilot comes with built-in system topics. You should know these:

System TopicTriggers When…Can You Edit?
GreetingUser starts conversationβœ… Yes
GoodbyeUser says bye/thanksβœ… Yes
EscalateUser asks for a humanβœ… Yes
FallbackNo topic matchesβœ… Yes
Start OverUser says "restart"βœ… Yes
ErrorAn action/flow failsβœ… Yes
πŸ’‘

Best practice: Always customize the Greeting and Fallback topics first. A good greeting sets tone; a good fallback prevents dead ends. Add a "Did you mean…?" suggestion to Fallback.

Node Types in the Canvas

πŸ’¬

Send a Message

Bot speaks. Supports text, images, buttons, adaptive cards, and rich content.

❓

Ask a Question

Prompts user for input. Captures the answer into a variable with an entity type.

πŸ”€

Condition (Branch)

If/else logic based on variable values. Splits the conversation into multiple paths.

⚑

Action (Plugin/Flow)

Calls Power Automate flows, HTTP connectors, or Dataverse operations.

πŸ”

Redirect to Topic

Jumps to another topic mid-conversation. Great for reusable sub-flows.

🏁

End Conversation

Gracefully terminates the session (with optional survey).

🎯 Knowledge Check
Which system topic fires when the bot cannot match the user's message to any topic?
A Greeting
B Escalate
C Fallback
D Error
πŸ“ Assignment 2

Interface Safari

  • Open Copilot Studio and create a new blank Copilot (name it anything)
  • Click through all 6 left-nav sections and note what each one contains
  • Open the Fallback system topic β€” what message does it currently send? Customize it to add a button that redirects to the Greeting topic
  • Use the Test Chat panel and type something random (e.g., "What is the meaning of life?") β€” what happens?
Module 1 Β· Foundations

Your First Copilot

We'll build a HR FAQ Bot β€” a copilot that answers employee questions about leave policy, benefits, and payroll. By the end of this lesson you'll have a working, publishable bot.

🏒 Real-World Scenario

Contoso Corp's HR team receives 200+ repetitive Slack messages per week about "How many vacation days do I have?" and "When is payday?". We'll automate these answers.

Step-by-Step: Create the Bot

1

Create a New Copilot

Go to copilotstudio.microsoft.com β†’ Create β†’ New copilot. Name it "Contoso HR Bot". Choose language: English. Skip the template for now.

2

Edit the Greeting

Open Topics β†’ Greeting. Change the default message to: "Hi! I'm the Contoso HR assistant. I can help with vacation, payroll, and benefits. What would you like to know?"

3

Create a New Topic: "Vacation Days"

Go to Topics β†’ + Add a topic β†’ From blank. Name it "Vacation Days". Add trigger phrases (see below). Add a Send Message node with the policy info.

4

Add Quick Replies

At the end of your message node, click + Add β†’ Quick replies. Add: "Tell me about payroll" and "I'm done, thanks". These help guide users to related topics.

5

Test It

Click Test your copilot (bottom left). Type "how many vacation days do I get?" β€” the bot should respond with your topic. If not, check your trigger phrases.

Trigger Phrases for "Vacation Days"

Trigger Phrases
how many vacation days do i get
what is the vacation policy
annual leave allowance
how much PTO do i have
time off policy
how many days off per year
holiday entitlement
πŸ“Œ

How many triggers do you need? Add at least 5-8 diverse phrasings. Copilot Studio uses NLU (Natural Language Understanding) so small variations are handled automatically, but more variety = better accuracy.

Bot Response with Adaptive Card

Instead of plain text, use an Adaptive Card for richer responses. In the message node, click +Add β†’ Adaptive card and paste this JSON:

Adaptive Card JSON
{
  "type": "AdaptiveCard",
  "version": "1.4",
  "body": [
    {
      "type": "TextBlock",
      "text": "πŸ–οΈ Vacation Policy",
      "size": "Large",
      "weight": "Bolder"
    },
    {
      "type": "FactSet",
      "facts": [
        { "title": "Year 1-2", "value": "15 days" },
        { "title": "Year 3-5", "value": "20 days" },
        { "title": "Year 6+",  "value": "25 days" }
      ]
    }
  ]
}

Topic Flow: Payroll FAQ

Create a second topic called "Payroll" with a branching question:

Topic Flow Logic
// Topic: Payroll
// Trigger: "when is payday", "salary date", "pay schedule"

ASK QUESTION: "Are you salaried or hourly?"
OPTIONS: ["Salaried", "Hourly"]
SAVE TO: EmploymentType (variable)

CONDITION: EmploymentType = "Salaried"
  β†’ SEND MESSAGE: "Salaried employees are paid on the 25th of each month."
ELSE:
  β†’ SEND MESSAGE: "Hourly employees are paid every Friday."

β†’ END CONVERSATION
🎯 Knowledge Check
You have two different answers depending on whether the user is salaried or hourly. Which node type should you use to split the conversation?
A Ask a Question node
B Send a Message node
C Condition (Branch) node
D Redirect to Topic node
πŸ“ Assignment 3

Build the HR Bot

  • Build the full Vacation Days topic with an Adaptive Card response
  • Build the Payroll topic with a branching question (Salaried vs Hourly)
  • Create a third topic: "Benefits" β€” list 3 employee benefits with quick reply buttons
  • Test all 3 topics in the test pane and note which trigger phrases work and which don't
  • Bonus: Add a "Redirect to Topic" at the end of each topic so the user can always ask another question
Module 2 Β· Core Building Blocks

Topics & Trigger Phrases

Topics are the heart of Copilot Studio. Understanding how topics are triggered, structured, and interconnected is the key skill that separates average bots from great ones.

How Trigger Matching Works

Copilot Studio uses a Natural Language Understanding (NLU) model to match user input to topics. It's not keyword matching β€” it understands intent.

🎯

Intent Matching

The NLU model maps the user's message to the closest topic based on semantic similarity, not just exact keywords.

πŸ“Š

Confidence Score

Each match has a confidence score. If below a threshold, the Fallback topic fires instead.

πŸ†

Best Match Wins

If multiple topics could match, the highest-confidence one wins. Keep trigger phrases unique per topic.

πŸ”’

Minimum 5 Phrases

Microsoft recommends at least 5 trigger phrases per topic for reliable NLU performance.

Topic Types

TypeCreated ByPurpose
Custom TopicYouYour business-specific conversation flows
System TopicPlatformGreeting, Fallback, Escalate, etc.
Lesson TopicsTemplatesSample topics in starter bots (can delete)

Advanced Topic Design Patterns

Pattern 1: Multi-Turn Conversation

Multi-Turn Flow
// Topic: Book a Meeting Room

ASK: "Which office location?"  β†’ Office
ASK: "What date?"             β†’ MeetingDate
ASK: "How many attendees?"    β†’ Attendees
SEND: "Checking availability for {Office} on {MeetingDate}..."
ACTION: Call Power Automate flow β†’ BookRoomFlow
SEND: "Room {RoomName} is booked! βœ…"

Pattern 2: Disambiguation

When a user says something vague like "I need help with account", you can ask a clarifying question:

Disambiguation Question
ASK: "What kind of account help do you need?"
OPTIONS: [
  "Reset Password"   β†’ Redirect to Password Reset topic
  "Update Profile"   β†’ Redirect to Profile Update topic
  "Billing Issue"    β†’ Redirect to Billing topic
  "Something else"  β†’ Redirect to Escalate topic
]

Pattern 3: Global Variables with "Track Context"

πŸ”‘

Global variables (prefixed with Global.) persist across topics in a session. Use them to track user identity, authenticated status, or language preference once, then use everywhere.

Topic Authoring Best Practices

βœ… Do❌ Don't
Use 5-10 diverse trigger phrasesUse only 1-2 triggers
Keep topics focused on one intentCram multiple intents into one topic
Add "End Conversation" or redirect at the endLeave dead-end topics with no exit
Customize the Fallback topicLeave the default Fallback as-is
Test with realistic user languageTest only with your exact trigger phrases
🎯 Knowledge Check
A user types "I want to reset my login credentials". Your topic's trigger phrase is "forgot password". Will it match?
A Yes β€” NLU matches by intent, not exact phrase
B No β€” phrases must match exactly
C Only if you add "reset credentials" as a trigger
D The Fallback topic fires instead
πŸ“ Assignment 4

Topic Architecture Design

  • Design a Customer Support Bot topic map on paper/Miro: identify 5 topics, their triggers, and how they interconnect via Redirects
  • Build 2 of those topics in Copilot Studio with at least one branch condition each
  • Create a disambiguation hub topic called "I need help" that asks a clarifying multiple-choice question and redirects to the right topic
  • Test: try 10 different phrasings and record which ones hit the wrong topic (these are your false positives to fix)
Module 2 Β· Core Building Blocks

Entities & Variables

Entities let you extract structured data from user messages. Variables let you store and reuse that data across your conversation. Together they power dynamic, intelligent conversations.

What are Entities?

An entity is a data type applied to a user's input when you ask a question. Copilot Studio has built-in entities and lets you create custom ones.

Built-in Entities

EntityRecognizesExample Input β†’ Extracted Value
Person nameHuman names"Call John Smith" β†’ John Smith
EmailEmail addresses"my email is [email protected]" β†’ [email protected]
Date and timeDates, times, durations"next Monday at 3pm" β†’ 2026-03-09T15:00
NumberIntegers, decimals"I need 5 tickets" β†’ 5
Phone numberPhone formats"my number is 555-1234" β†’ 555-1234
CityCity names"I'm in Montreal" β†’ Montreal
BooleanYes/No"yes please" β†’ true

Custom Entities

Custom entities let you recognize domain-specific values β€” like product names, department codes, or order statuses.

1

Closed List Entity

A fixed set of values you define. E.g., Department = ["HR", "IT", "Finance", "Marketing", "Sales"]. Copilot handles synonyms: "information technology" β†’ IT.

2

Regex Entity

Matches text using a regular expression pattern. Perfect for Order IDs (ORD-\d{6}), employee codes, or SKUs.

Example: Custom "Department" Entity

Closed List Entity Config
Entity Name: Department
Type: Closed list

Values & Synonyms:
  HR          β†’ ["human resources", "people team", "hr dept"]
  IT          β†’ ["information technology", "tech support", "helpdesk"]
  Finance     β†’ ["accounting", "payroll team", "finance dept"]
  Marketing   β†’ ["comms", "marketing team"]

Variables: Types & Scope

Variable TypeScopePrefixUse Case
Topic VariableCurrent topic only(none)Temporary data within one flow
Global VariableEntire conversation sessionGlobal.Username, auth token, language
System VariablePlatform-providedSystem.User ID, channel, conversation ID

Using Variables in Messages

Variable Interpolation
// After capturing user's name into Global.UserName

SEND MESSAGE:
"Thanks, {Global.UserName}! I've raised a support ticket for the 
{Department} team. Your ticket number is {TicketID}. 
Our team will respond within 24 hours."

// Result example:
// "Thanks, Amir! I've raised a support ticket for the IT team.
//  Your ticket number is TK-00341. Our team will respond within 24 hours."

Variable Manipulation with Power Fx

Copilot Studio supports Power Fx (Excel-like formula language) for transforming variables:

Power Fx Expressions
// Concatenate strings
Concatenate("Hello, ", Global.UserName, "!")

// Today's date formatted
Text(Today(), "MMMM DD, YYYY")

// Conditional expression
If(Topic.AttendeeCount > 10, "Large room", "Small room")

// Upper case
Upper(Topic.Department)

// Check if email is valid
IsMatch(Topic.Email, Match.Email)
⚠️

Common Mistake: Trying to use a topic variable outside its topic. If you need data to persist across topics (like a logged-in user's name), use a Global. variable instead.

🎯 Knowledge Check
You ask "What is your department?" and the user types "I work in information technology". Your entity is a Closed List with "IT" and synonym "information technology". What value is stored in the variable?
A "information technology"
B "IT"
C null β€” no match
D The full sentence
πŸ“ Assignment 5

Dynamic IT Support Bot

  • Create a custom Closed List entity called "IssueType" with values: Password Reset, Software Install, Hardware Repair, Network Issue
  • Build a topic "Report an IT Issue" that asks for: (1) User's name [Person entity], (2) Issue type [IssueType entity], (3) Urgency level [Number 1-5]
  • Use a Condition node: if Urgency β‰₯ 4, send a different message than if Urgency < 4
  • End with: "Thanks {Name}, your {IssueType} issue (Priority {Urgency}) has been logged." using variables
  • Bonus: Store the user's name in a Global.UserName variable and use it in the Greeting topic too
Module 2 Β· Core Building Blocks

Actions & Power Automate

Actions are how your Copilot does things β€” not just talks. Calling APIs, reading SharePoint lists, creating records in Dataverse, sending emails, booking meetings. All of this is done by connecting to Power Automate flows.

What's an Action?

πŸ”Œ

Plugin Action

Connect to a Power Automate flow. Pass variables in, receive values back.

🌐

HTTP Request

Call external REST APIs directly from a topic. Supports GET, POST, PUT, DELETE.

πŸ—ƒοΈ

Dataverse Action

Read or write records in Microsoft Dataverse (the data layer of Power Platform).

πŸ€–

AI Builder Action

Call AI Builder models for document processing, classification, or prediction.

Building a Power Automate Integration

🎯 Scenario

The HR bot needs to check an employee's actual remaining vacation days from an HR system. The bot asks for the employee ID, calls a Power Automate flow that queries a SharePoint list, and returns the days remaining.

1

Add Action Node to Topic

In your topic canvas, click + Add node β†’ Call an action β†’ Create a flow. This opens Power Automate in a new tab with a pre-built Copilot Studio trigger.

2

Define Input Parameters

In Power Automate, the trigger "When Copilot Studio calls a flow" lets you define input parameters. Add: EmployeeID (string). This is how you pass the variable from the bot to the flow.

3

Add the Logic

Add actions in Power Automate: Get item from SharePoint list (filter by EmployeeID). Extract the VacationDaysRemaining field.

4

Return Output to Bot

Add a "Return value(s) to Copilot Studio" step. Add output: VacationDays (number). Save and publish the flow.

5

Map I/O in the Topic

Back in Copilot Studio, the action node now shows input/output slots. Map EmployeeID β†’ Topic.EmployeeID variable. Map output VacationDays β†’ new variable Topic.DaysLeft.

The Power Automate Flow (Visual Summary)

TRIGGER: When Copilot Studio calls a flow β”‚ Inputs: EmployeeID (string) β–Ό ACTION: Get item from SharePoint β”‚ Site: HR Portal β”‚ List: EmployeeLeave β”‚ Filter: EmployeeID eq '{EmployeeID}' β–Ό ACTION: Compose (extract field) β”‚ Expression: items('Get_item')?['VacationDaysRemaining'] β–Ό RETURN: Return value to Copilot Studio VacationDays = outputs('Compose')

Using the Return Value in the Topic

Topic Flow After Action
// Action node returns Topic.DaysLeft (number)

CONDITION: Topic.DaysLeft > 0
  β†’ SEND: "You have {Topic.DaysLeft} vacation days remaining. πŸŽ‰"
ELSE:
  β†’ SEND: "You have no vacation days left this year. Please contact HR 
  if you believe this is an error."

HTTP Request Action (No-Code API Calls)

HTTP Action Config
Method: GET
URL: https://api.contoso.com/weather?city={Topic.City}
Headers:
  Authorization: Bearer {Global.APIToken}
  Content-Type: application/json

Response Body (JSON Path Mapping):
  Topic.Temperature  ← $.current.temp_c
  Topic.Condition    ← $.current.condition.text
πŸ’‘

Error Handling: Always add an On Error path after Action nodes. If a flow fails (API down, bad data), the bot should respond gracefully: "Sorry, I couldn't check that right now. Please try again later."

🎯 Knowledge Check
How do you pass a variable from Copilot Studio into a Power Automate flow?
A Via a Global variable automatically
B Define input parameters in the flow trigger and map them in the Action node
C Copy-paste the variable name into the flow
D You can't β€” flows and bots can't share data
πŸ“ Assignment 6

Live Data Integration

  • Create a SharePoint list called "IT Assets" with columns: EmployeeID, AssetType, SerialNumber, Status
  • Build a Power Automate flow: receive EmployeeID β†’ query SharePoint β†’ return AssetType and SerialNumber
  • In your IT Support Copilot, add an action that calls this flow and displays the employee's assigned device
  • Add error handling: if the employee ID returns no results, send a fallback message
  • Bonus: Use an HTTP action to call a free public API (e.g., wttr.in/Montreal?format=j1) and display weather in a message
Module 3 Β· Advanced

Generative AI & Knowledge Sources

This is where Copilot Studio becomes truly powerful: Generative Answers lets your bot answer questions from documents, websites, and SharePoint β€” without you writing a single topic for each question. Powered by Azure OpenAI GPT models.

What are Generative Answers?

Instead of manually authoring a topic for every possible question, you point the bot at a knowledge source and it uses GPT to generate grounded, accurate answers from that content automatically.

πŸ“„

Documents

Upload PDFs, Word docs, or text files. The bot answers from their content.

🌐

Websites / URLs

Point to public web pages. The bot indexes and answers from them.

πŸ“

SharePoint

Connect to SharePoint sites. The bot searches and answers from your org's internal docs.

πŸ”Œ

Dataverse / Custom

Plug in custom knowledge via connectors or Bing Search integration.

Setting Up Knowledge Sources

1

Go to Knowledge Tab

In the left nav, click Knowledge. Click + Add knowledge. Choose your source type (Public website, File, SharePoint, etc.).

2

Add a Public Website

Enter up to 2 URLs (e.g., https://support.contoso.com). Copilot Studio crawls and indexes the pages. Takes a few minutes to process.

3

Enable Generative Answers in Settings

Go to Settings β†’ AI features β†’ Generative answers. Toggle on "Allow the AI to use its own general knowledge" and "Use knowledge sources".

4

Test It

Ask a question your knowledge source can answer. The bot responds with a generated answer and cites the source. If no topic matches AND the knowledge source has an answer, it falls back to generative answers automatically.

Generative Answers Architecture

USER MESSAGE "How many days off do I get?" INTENT ROUTING βœ“ Topic Match Found NLU confidence above threshold β†’ Execute Authored Topic βœ— No Topic Match Falls through to knowledge layer β†’ Check Knowledge Sources GENERATIVE ANSWERS ENGINE β‘  Semantic Search Query vectors across knowledge sources β‘‘ Retrieve Chunks Top-K relevant document segments β‘’ Send to Azure OpenAI Prompt = query + retrieved context β‘£ Grounded Response GPT answers only from context BOT RESPONSE Generated answer Β· Source citation Β· Confidence indicator "According to the Employee Handbook (p.12), you receive 20 days." KNOW- LEDGE PDF SharePoint Web URLs

Generative Answers Inside a Topic

You can also trigger generative answers within a specific topic node, for more controlled use:

Generative Answer Node Config
// In a topic, add a "Generative answers" node

Input:  Activity.Text          // User's latest message
Sources: ["HR Policy Website", "Employee Handbook PDF"]

// This searches ONLY those sources, not your whole knowledge base
// Output is a generated response grounded in those documents

Fallback behavior: 
  If no answer found β†’ redirect to Escalate topic

Content Moderation & Safety

FeatureWhat it does
Content moderationBlocks harmful, offensive, or off-topic responses from GPT
Grounding onlyBot ONLY answers from your documents β€” no hallucination from general knowledge
Citation displayShows source document/URL in the response for trust and transparency
Sensitivity labelsRespect Microsoft Purview labels β€” doesn't expose restricted content
πŸ”‘

RAG Pattern: This is Retrieval-Augmented Generation under the hood β€” the same architecture you've studied for agentic systems. Copilot Studio just abstracts the embedding, chunking, and vector search layers into a no-code configuration.

🎯 Knowledge Check
A user asks a question that doesn't match any authored topic, but the answer exists in an indexed SharePoint document. What happens?
A The Fallback topic fires and says "I don't know"
B Generative Answers engine retrieves from the document and GPT generates a grounded response
C The bot escalates to a human agent immediately
D The bot searches the web for an answer
πŸ“ Assignment 7

RAG-Powered Knowledge Bot

  • Upload a PDF (a product manual, policy doc, or any multi-page document) as a knowledge source
  • Add a public URL (your company's FAQ page, or any public site) as a second source
  • Test 5 questions β€” 3 that ARE in the document, 2 that are NOT. Observe the difference in responses
  • Enable "grounding only" mode β€” re-test the 2 out-of-scope questions. What changes?
  • Bonus: Create a topic that uses a Generative Answer node scoped to only one knowledge source for a specific topic area
Module 3 Β· Advanced

Deployment & Channels

Your Copilot is ready. Now let's get it in front of real users. Copilot Studio supports deployment to multiple channels β€” from Microsoft Teams to custom websites to WhatsApp β€” all from the same configuration.

Publishing Your Copilot

1

Review & Validate

Before publishing, use Topic Checker (the warning icon in the top bar) to find any broken nodes, missing variables, or disconnected paths.

2

Click Publish

Hit the Publish button (top right). The bot compiles and deploys to all connected channels. Publishing usually takes 30–60 seconds.

3

Share via Demo Link

Under Settings β†’ Channels β†’ Demo website, you get a hosted demo URL to share immediately. Great for stakeholder demos without full deployment.

Channel Overview

ChannelUse CaseSetup Complexity
πŸ–₯️ Demo WebsiteInternal testing, stakeholder demosZero β€” instant link
🌐 Custom WebsiteEmbed in your own site or portalLow β€” copy/paste embed code
πŸ’Ό Microsoft TeamsInternal employees, HR/IT botsLow β€” Teams app setup
πŸ“± Mobile AppNative app integrationMedium β€” Direct Line SDK
πŸ“ž WhatsAppCustomer-facing supportMedium β€” Meta Business Account needed
πŸ€– SlackDev teams, external communitiesMedium β€” Slack App setup
πŸ“‘ Direct LineCustom channels, Power AppsHigh β€” API integration

Embedding on a Website

Website Embed Code (HTML)
<!-- Add to your HTML <body> -->

<script>
  var WebChat = {};
  WebChat.onLoad = function() {
    WebChat.renderWebChat({
      directLine: WebChat.createDirectLine({
        token: 'YOUR_BOT_TOKEN_HERE'
      }),
      styleOptions: {
        botAvatarInitials: 'HR',
        accent: '#0063B1',
        bubbleBorderRadius: 8
      }
    }, document.getElementById('webchat'));
  };
</script>
<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"
  onload="WebChat.onLoad()"></script>

<div id="webchat" style="height:500px; width:400px;"></div>

Deploying to Microsoft Teams

1

Enable Teams Channel

In Copilot Studio β†’ Settings β†’ Channels β†’ Microsoft Teams. Click Turn on Teams. This creates a Teams app package.

2

Submit to Teams Admin

Download the app package (ZIP). In Microsoft Teams Admin Center, upload it as a custom app. Assign it to specific users or teams.

3

Enable Proactive Messaging (Optional)

Your bot can send messages without the user initiating first β€” e.g., send a reminder when a ticket SLA is approaching. Configure via Power Automate + Teams connector.

Analytics & Monitoring

After deployment, use the Analytics tab to monitor:

MetricWhat to look for
Session countVolume of conversations over time
Engagement rate% of sessions where users engaged vs. abandoned
Resolution rate% of sessions resolved without escalation
Escalation rateHow often users say "talk to a human" (high = bot not helping)
Unrecognized phrasesTop phrases that hit the Fallback β€” these become new topics
Topic volumeWhich topics are used most β€” tells you where to invest
πŸ’‘

Continuous Improvement Loop: Review "Unrecognized phrases" weekly. These are real user questions your bot can't answer β€” each one is a new topic to build. This feedback loop is how production bots improve over time.

Authentication & Security

πŸ”

No Auth

Public bot, no login. Anyone can chat. Good for external FAQ bots.

🏒

Azure AD (SSO)

Authenticate with Microsoft account. Bot knows who you are. Good for internal bots accessing personal data.

πŸ”‘

Generic OAuth 2.0

Connect to any OAuth provider (Google, Okta, custom IdP). For external customer-facing bots.

πŸ›‘οΈ

Manual (Token)

Pass a token via the embed code for server-side authentication scenarios.

🎯 Final Knowledge Check
The analytics show a high "escalation rate" and many unrecognized phrases. What should you do first?
A Unpublish the bot and start over
B Increase the number of agents handling escalations
C Review unrecognized phrases and build new topics to address them
D Switch to a different bot platform
πŸ“ Final Assignment

Deploy Your Production-Ready Bot

Bring everything together into a complete, deployable Copilot.

  • Build: A complete bot with β‰₯ 5 custom topics, 2 Power Automate integrations, and 1 knowledge source
  • Security: Configure authentication (Azure AD for internal or No Auth for external use case)
  • Deploy: Publish and share a Demo Website link β€” test on mobile and desktop
  • Teams: Enable the Teams channel and install the bot in your personal Teams chat
  • Analyze: Generate 20 test sessions with varied inputs, then review Analytics β€” list 3 improvements
  • Document: Write a 1-page handover doc: bot purpose, topics map, integrations, and maintenance guide

πŸŽ‰ Course Complete! You now have the skills to design, build, integrate, and deploy Microsoft Copilot Studio bots from scratch. The next steps: explore Copilot Extensions (custom plugins via OpenAPI), Copilot Studio + Azure AI Foundry for pro-code hybrid architectures, and Multi-bot orchestration patterns.